#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "QFileSystemModel"
#include "boofergh.h"
#include "apidecoding.h"
#include "ghmodel.h"
#include "QLabel"
//#include "chartwidget.h"


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

/*!
 * \brief MainWindow class Отвечает за весь интерфейс, задаёт функции для элементов управления интерфейса
*/

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    /// модель локальной файловой системы
    QFileSystemModel *fyleSystemModel;
    /// экземпляр класса ApiDecoding
    ApiDecoding *apidecoding;
    /// подпись версии программы
    QLabel *info;
    /// экземпляр класса GHModel
    GHModel *GH_model;
    /// вектор коэффициентов полинома
    vector<double> res;

    /*!
     * \brief Dat_to_SQL сохраняет .dat файл в виде таблицы в текстовый файл
    */
    void Dat_to_SQL();
    /*!
     * \brief Visual_poly создаёт графическое представление аппроксимирующей функции
    */
    void Visual_poly();
    void Visual(double *x_values, double *y_values, int input_size);
    /*!
     * \brief Visual_mera создаёт графическое представление данных .dat файла
    */
    void Visual_mera();
    /*!
     * \brief make_test_data генерирует узлы интерполяции со случайным отклонением из функции sin
     *
     * \param[in] count требуемое кол-во узлов
     * \param[in] step шаг между узлами
     * \param[in] shift процент отклонения
    */
    void make_test_data(int count, double step, double shift);
    /*!
     * \brief open_file Скачивает из текстового файла в буфер (в apidecoding) градуировочную характеристику
     *
     * \param[in] filePath путь к файлу
    */
    void open_file(QString filePath);

    /*!
     * \brief build_file_system_model Инициализирует переменную класса fyleSystemModel
    */
    void build_file_system_model();
    /*!
     * \brief build_GHmodel Инициализирует переменную класса GH_model
    */
    void build_GHmodel();
    /*!
     * \brief line_to_boofer Преобразует текстовую строку в пару чисел x и y, добавляет их в буфер (в apidecoding),
     * по средствам диалоговых окон запрашивает разрешение на продолжение чтения строк в случае некорректной входной строки
     *
     * \param[in] line строка
     * \param[in] row_number соответствует порядковому номеру в файле у строки
     * \return false если пользователь запросил прекращения чтения в диалоговом окне, true в ином случае
    */
    bool line_to_boofer(QString line, int row_number);
    /*!
     * \brief boofer_to_polynom получает из градуировочной характеристики, хранящейся в переменной класса apidecoding, полином и записывает его в QTableWidget
    */
    void boofer_to_polynom();

private slots:
    /*!
     * \brief open_file_dialog Открывает диалог с файловой системой для послелующей работы с файлом с ГХ
    */
    void open_file_dialog();
    /*!
     * \brief save_to_file Сохраняет расчитанный полином в выбранный текстовый файл через диалог с файловой системой
    */
    void save_to_file();
    /*!
     * \brief open_info Открывает окно с текущей версией данного приложения
    */
    void open_info();
    /*!
     * \brief open_file_tree взаимодействуя с переменной класса fyleSystemModel получает путь к файлу для послелующей работы с файлом с ГХ
    */
    void open_file_tree(const QModelIndex &index);
    /*!
     * \brief change_filter_file_systemModel Изменяет допустимые расширения отображаемые в QTreeView
     *
     * \param[in] line строка показываемая пользователю через QComboBox, содержащая в себе допустимые расширения и информацию для пользователя
    */
    void change_filter_file_systemModel(const QString &line);
    /*!
     * \brief add_data_line Создаёт новую строку в переменной класса GH_model и заполняет её нулями. Данная строка будет под выделенной строкой таблицы ГХ, либо в конце таблицы, если строка не выделенна
    */
    void add_data_line();
    /*!
     * \brief remove_data_line удаляет строку в переменной класса GH_model. Удаляется выделенная строка таблицы ГХ, либо последняя строка, если строки не выделенны
    */
    void remove_data_line();
    /*!
     * \brief to_clipboard Сохраняет выделенную часть таблицы ГХ в буфер обмена
    */
    void to_clipboard();
    /*!
     * \brief from_clipboard Загружает данные из буфера обмена в выделенную часть таблицы ГХ либо, если это возможно, вставляет данные в конец таблицы
    */
    void from_clipboard();


};
#endif // MAINWINDOW_H
